
/**
 * tabBar底部导航栏页面路径列表
 * tabBarLinks为常量, 无需修改
 */
const tabBarLinks = [
  'pages/index/index',   // 首页
  'pages/square/index',  // 广场
  'pages/homework/index',  // 作业
  'pages/user/index'  // 个人中心
];

// 站点信息
import siteInfo from 'siteinfo.js';

App({
  /**
   * 全局变量
   */
  globalData: {
    user_id: null,
  },

  api_root: '',  // api地址
  appid: '',  // 小程序id

  /**
   * 生命周期函数--监听小程序初始化
   */
  onLaunch() {
    // this是方法执行时生成的一个内部的局部对象，复制this可以防止找不到原来的对象
    let App = this;
    // 设置基本信息与初始化调用用户登录
    App.setBaseInfo();
    App.doLogin();
  },

  /**
   * 当小程序启动，或从后台进入前台显示，会触发 onShow
   */
  onShow(options) {},

  /**
   * 设置api地址
   */
  setBaseInfo() {
    let App = this;
    App.api_root = `${siteInfo.siteroot}`;
    App.appid = `${siteInfo.appid}`;
  },

  /**
   * 对于一些动态页面向后端获取小程序基础信息并存储
   */
  getWxappBase(callback) {
    let App = this;
    App._get('wxapp/base', {}, result => {
      // 记录小程序基础信息
      wx.setStorageSync('wxapp', result.data.wxapp);
      callback && callback(result.data.wxapp);
    }, false, false);
  },

  /**
   * 执行用户登录
   */
  doLogin() {
    let openId = wx.getStorageSync('openId');
    if (!openId) {
      // 保存当前页面
      let pages = getCurrentPages();
      if (pages.length) {
        let currentPage = pages[pages.length - 1];
        "pages/login/login" != currentPage.route &&
          wx.setStorageSync("currentPage", currentPage);
      }
      // 跳转登录授权页面
      wx.navigateTo({
        url: "/pages/login/login"
      });
    }else {
      return true;
    }
  },

  /**
   * 当前用户id
   */
  // getUserId() {
  //   return wx.getStorageSync('user_id') || 0;  // 缺省 0
  // },

  /**
   * 显示成功提示框
   */
  showSuccess(msg, callback) {
    wx.showToast({
      title: msg,
      icon: 'success',
      success() {
        callback && (setTimeout(() => {
          callback();
        }, 1500));
      }
    });
  },

  /**
   * 显示失败提示框
   */
  showError(msg, callback) {
    wx.showModal({
      title: '友情提示',
      content: msg,
      showCancel: false,
      success(res) {
        callback && callback();
      }
    });
  },

  /**
   * get请求, 需要登录
   */
  _get(url, data, success, fail, complete) {
    let App = this;
    wx.showNavigationBarLoading();

    if (!this.checkIsLogin()) {
      this.showError("请先登录")
      return false;
    }

    // 构造请求参数
    data = Object.assign({
      wxapp_id: this.appid,
      openId: wx.getStorageSync('openId')  // 有可能后台以别的参数为openId，还要再在data赋值
    }, data);

    // 构造get请求方法
    let request = () => {
      wx.request({
        url: App.api_root + url,
        header: {
          'content-type': 'application/json'
        },
        data,
        success(res) {
          if (res.statusCode !== 200 || typeof res.data !== 'object') {
            App.showError('网络请求出错');
            return false;
          } else if (res.data.status  !== 200) {  // 请求响应成功，但是响应信息不是预期的，原因有很多，例如用户是不存在的
            App.showError(res.data.msg);
            return false;
          } else {
            success && success(res.data.data);  // 真正成功，将数据中心返回
          }
        },
        fail(res) {
          console.log(res);
          App.showError(res.errMsg, () => {
            fail && fail(res);
          });
        },
        complete(res) {
          wx.hideNavigationBarLoading();
          complete && complete(res);
        },
      });
    };
    // 判断是否已登录
    App.checkIsLogin ? request() : App.doLogin(request);
  },

  /*
   * get请求，不用验证登录
   */
  _getWithout(url, data, success, fail, complete) {
    let App = this;
    wx.showNavigationBarLoading();

    // 构造请求参数
    data = Object.assign({
      wxapp_id: this.appid,
      openId: wx.getStorageSync('openId') 
    }, data);

    // 构造get请求
    let request = () => {
      wx.request({
        url: App.api_root + url,
        header: {
          'content-type': 'application/json'
        },
        data,
        success(res) {
          if (res.statusCode !== 200 || typeof res.data !== 'object') {
            App.showError('网络请求出错');
            return false;
          } else if (res.data.status !== 200) {
            App.showError(res.data.msg);
            return false;
          } else {
            success && success(res.data.data);
          }
        },
        fail(res) {
          // console.log(res);
          App.showError(res.errMsg, () => {
            fail && fail(res);
          });
        },
        complete(res) {
          wx.hideNavigationBarLoading();
          complete && complete(res);
        },
      });
    };
    request();
  },
  /**
   * post提交，需要登录权限
   */
  _post(url, data, success, fail, complete) {
    wx.showNavigationBarLoading();
    let App = this;

    if (!this.checkIsLogin()) {
      this.showError("请先登录")
      return false
    }
    // 构造请求参数，自动添加openId所以调用这个方法不用再加openId
    data = Object.assign({
      openId: wx.getStorageSync('openId')
    }, data);
    let request = () => {
      wx.request({
        url: App.api_root + url,
        header: {
          'content-type': 'application/x-www-form-urlencoded',
        },
        method: 'POST',
        data,
        success(res) {
          if (res.statusCode !== 200 || typeof res.data !== 'object') {
            App.showError('网络请求出错');
            return false;
          } else if (res.data.status !== 200) {
            App.showError(res.data.msg, () => {
              fail && fail(res);
            });
            return false;
          } else {
            success && success(res.data.data);
          }
        },
        fail(res) {
          App.showError(res.errMsg, () => {
            fail && fail(res);
          });
        },
        complete(res) {
          wx.hideLoading();
          wx.hideNavigationBarLoading();
          complete && complete(res);
        }
      });
    }
    App.checkIsLogin ? request() : App.doLogin();
  },
  /**
   * post提交，不需要验证登录
   */
  _postWithout(url, data, success, fail, complete) {
    wx.showNavigationBarLoading();
    let App = this;

    // 构造请求参数
    data = Object.assign({
      wxapp_id: this.appid,
      openId: wx.getStorageSync('openId')
    }, data);

    let request = () => {
      wx.request({
        url: App.api_root + url,
        header: {
          'content-type': 'application/json',
        },
        method: 'POST',
        data,
        success(res) {
          if (res.statusCode !== 200 || typeof res.data !== 'object') {
            App.showError('网络请求出错');
            return false;
          } else if (res.data.status !== 200) {
            App.showError(res.data.msg, () => {
              fail && fail(res);
            });
            return false;
          } else {
            success && success(res.data.data);
          }
        },
        fail(res) {
          App.showError(res.errMsg, () => {
            fail && fail(res);
          });
        },
        complete(res) {
          wx.hideLoading();
          wx.hideNavigationBarLoading();
          complete && complete(res);
        }
      });
    }
    request();
  },
  /**
   * 验证是否存在user_info
   */
  validateUserInfo() {
    // let user_info = wx.getStorageSync('user_info');
    return !!wx.getStorageSync('user_info');
  },

  /**
   * 对象转URL
   */
  urlEncode(data) {
    var _result = [];
    for (var key in data) {
      var value = data[key];
      if (value.constructor == Array) {
        value.forEach(_value => {
          _result.push(key + "=" + _value);
        });
      } else {
        _result.push(key + '=' + value);
      }
    }
    return _result.join('&');
  },

  /**
   * 设置当前页面标题
   */
  // setTitle() {
  //   let App = this, wxapp;
  //   if (wxapp = wx.getStorageSync('wxapp')) {
  //     wx.setNavigationBarTitle({
  //       title: wxapp.navbar.wxapp_title
  //     });
  //   } else {
  //     App.getWxappBase(() => {
  //       App.setTitle();
  //     });
  //   }
  // },

  /**
   * 设置navbar标题、颜色
   */
  setNavigationBar() {
    let App = this;
    // 获取小程序基础信息
    App.getWxappBase(wxapp => {
      // 设置navbar标题、颜色
      wx.setNavigationBarColor({
        frontColor: wxapp.navbar.top_text_color.text,
        backgroundColor: wxapp.navbar.top_background_color
      })
    });
  },

  /**
   * 获取tabBar页面路径列表
   */
  getTabBarLinks() {
    return tabBarLinks;
  },

  /**
   * 验证登录
   */
  checkIsLogin() {
    return wx.getStorageSync('openId') !== '';
  },

  /**
   * 授权登录
   */
  getUserInfo(e, callback) {
    let App = this;
    if (e.detail.errMsg !== 'getUserInfo:ok') {
      return false;
    }
    wx.showLoading({
      title: "正在登录",
      mask: true
    });
    // 执行微信登录
    wx.login({
      // 成功回调函数
      success(res) {
        console.log(e.detail.rawData)
        // 向后端发送用户信息获取openId
        App._postWithout('calligraphy/login/', {
          code: res.code,
          user_info: e.detail.rawData,
          // encrypted_data: e.detail.encryptedData,
          // iv: e.detail.iv,
          // signature: e.detail.signature
        }, result => {
          // console.log(result.openId);
          // 记录openId
          wx.setStorageSync('openId', result.openId);
          // 执行回调函数
          callback && callback();
        }, false, () => {
          wx.hideLoading();
        });
      },
      // 失败回调函数
      fail(res) {
        wx.showModal({
          title: '登录失败',
          content: '向微信获取公开信息失败，请稍后再试'
        })
      }
    });
  },

});